Auto merge of #1668 - alexcrichton:perf, r=alexcrichton
Playing around with Servo recently I realized that a "noop build" (e.g. `cargo build` had no work to do) took about 5s to complete on my machine! I wasn't super happy with this performance, so I investigated the performance and applied a number of optimizations as part of this PR:
* Primarily, algorithmic changes were made to not traverse the dependency graph too often. There were previously two code paths where each node in the graph would traverse its entire subgraph, causing excessively high runtimes.
* Many minor changes were made to reduce allocations and in general cache results between invocations.
* The Rust version in use was updated to pick up the recent change to look at `DT_DIR` for `DirEntry::file_type`
Overall this PR improves a noop build of Servo from 5s to 0.5s on my machine.